package main

import (
	list "container/list"
	"fmt"
)

/*

列表是一种非连续的存储容器，由多个节点组成，节点通过一些变量记录彼此之间的关系，列表有多种实现方法，如单链表、双链表等。

在Go语言中，列表使用container/list包来实现，内部的实现原理是双链表，列表能够高效地进行任意位置的元素插入和删除操作。

变量名 := list.New()
var 变量名 list.List

列表与切片和map不同的是，列表并没有具体元素类型的限制，因此列表的元素可以是任意类型，这既带来了便利，也引来一些问题，例如给列表中放入了一个interface{}类型的值，取出值后，如果要将interface{}转换为其他类型将会发生宕机。

*/

func main() {

	l := list.New()
	l.PushBack("fist")
	l.PushFront(67)

	fmt.Println(l)

	// 尾部添加
	l.PushBack("canon")
	// 头部添加
	l.PushFront(67)
	// 尾部添加后保存元素句柄
	element := l.PushBack("fist")
	// 在fist之后添加high
	l.InsertAfter("high", element)
	// 在fist之前添加noon
	l.InsertBefore("noon", element)
	// 使用
	l.Remove(element)

	// 遍历
	for i := l.Front(); i != nil; i = i.Next() {
		fmt.Println(i.Value)
	}

	// 另一种创建方式
	var l2 = list.List{}
	fmt.Println(l2)
}
